package com.lzy.product.apis.impl;

import com.github.pagehelper.PageInfo;
import com.lzy.framework.core.ensure.Ensure;
import com.lzy.framework.core.orm.db.Pager;
import com.lzy.product.apis.ProductClassifyServiceApi;
import com.lzy.product.apis.ProductInfoClassifyServiceApi;
import com.lzy.product.dtos.ProductClassifyDto;
import com.lzy.product.dtos.ProductInfoClassifyDto;
import com.lzy.product.service.ProductClassifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created by WIN7 on 2017/11/28.
 */
@Service
public class ProductClassifyServiceApiImpl implements ProductClassifyServiceApi {

    @Autowired
    ProductClassifyService produceClassifyService;
    @Autowired
    ProductInfoClassifyServiceApi productInfoClassifyServiceApi;

    @Override
    public Long insert(ProductClassifyDto dto) {
        return produceClassifyService.insert(dto);
    }

    @Override
    public Boolean update(ProductClassifyDto dto) {
        return produceClassifyService.update(dto);
    }

    @Override
    public Boolean delete(Long id) {
        return produceClassifyService.delete(id);
    }

    @Override
    public Boolean remove(Long id) {
        return produceClassifyService.remove(id);
    }

    @Override
    public ProductClassifyDto findById(Long id) {
        return produceClassifyService.findById(id);
    }

    @Override
    public List<ProductClassifyDto> query(ProductClassifyDto dto) {
        return produceClassifyService.query(dto);
    }

    @Override
    public PageInfo<ProductClassifyDto> selectList(Pager pager, ProductClassifyDto dto) {
        return produceClassifyService.selectList(pager, dto);
    }

    @Override
    public Integer removeList(String ids) {
        return produceClassifyService.removeList(ids);
    }

    @Override
    public Boolean updateSurplusByProductId(Long productId, Integer number, String mark) {
        Ensure.that(productId).isNotNull("02000010");
        Ensure.that(number).isNotNull("02000010");
        Ensure.that(mark).isNotNull("02000010");
        //根据产品id获取分类id信息。
        ProductInfoClassifyDto infoClassifyDto = new ProductInfoClassifyDto();
        infoClassifyDto.setInfoId(productId);
        ProductInfoClassifyDto infoClassifyDto1 = productInfoClassifyServiceApi.selectProductClassify(infoClassifyDto);
        if (infoClassifyDto1 != null && infoClassifyDto1.getClassifyId() != null) {
            ProductClassifyDto classifyDto = produceClassifyService.findById(infoClassifyDto1.getClassifyId());
            if (classifyDto != null) {
                Date currentTime = new Date();
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH");
                String dateString = formatter.format(currentTime);
                //存在销售起始时间，判断当前时间是否在销售时间内
                if (!classifyDto.getStartTime().equals("")  && !classifyDto.getEndTime().equals("")) {
                    Integer m = compareDate(classifyDto.getStartTime(), dateString);
                    Integer n = compareDate(classifyDto.getEndTime(), dateString);
                    //m == 1表示未开始，n == 3表示已结束，其它情况表示进行中
                    if (m != 1 && n != 3) {
                        //存在销售时间，存在库存量
                        if (classifyDto.getSurplus() != null) {
                            //+标识释放资源/-标识抢占资源
                            return updateSurPlus(classifyDto,number,mark);
                            //存在销售时间，不存在库存，自动下单成功。
                        }else if(classifyDto.getSurplus() != null){
                            return true;
                        }
                    }
                    //不存在销售时间，存在库存
                }else if(classifyDto.getStartTime().equals("")  && classifyDto.getEndTime().equals("")){
                    if (classifyDto.getSurplus() != null) {
                        //+标识释放资源/-标识抢占资源
                        return updateSurPlus(classifyDto,number,mark);
                    }
                }
            }
        }
        return false;
    }

    //释放资源和抢占资源方法
    public Boolean updateSurPlus(ProductClassifyDto classifyDto,Integer number,String mark){
        if (mark.equals("-")) {
            if (classifyDto.getSurplus() >= number) {
                ProductClassifyDto classifyDto1 = new ProductClassifyDto();
                classifyDto1.setId(classifyDto.getId());
                classifyDto1.setSurplus(classifyDto.getSurplus() - number);
                return produceClassifyService.update(classifyDto1);
            } else {
                return false;
            }
        } else if (mark.equals("+")) {
            ProductClassifyDto classifyDto2 = new ProductClassifyDto();
            classifyDto2.setId(classifyDto.getId());
            classifyDto2.setSurplus(classifyDto.getSurplus() + number);
            return produceClassifyService.update(classifyDto2);
        }
        return false;
    }

    //比较两个日期的大小（格式：yyyy-MM-dd HH）
    public Integer compareDate(String d1, String d2) {
        String date1 = d1.substring(0,d1.length()-3);
        String date2 = d2.substring(0,d2.length()-3);
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            long l = System.currentTimeMillis();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            System.out.println(dateFormat.format(l));
            Date dt1 = df.parse(date1);
            Date dt2 = df.parse(date2);
            if (dt1.getTime() > dt2.getTime()) {
                return 1;
            } else if (dt1.getTime() == dt2.getTime()) {
                Integer m = Integer.valueOf(d1.substring(d1.length() - 2),d1.length());
                Integer k = Integer.valueOf(d2.substring(d2.length() - 2),d2.length());
                if(m < k){
                    return 3;
                }else if (m > k){
                    return 1;
                }else{
                    return 2;
                }
            } else if (dt1.getTime() < dt2.getTime()) {
                return 3;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    @Override
    public Boolean updateShelves(Integer shelves, String ids) {
        return produceClassifyService.updateShelves(shelves,ids);
    }
}
